#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
日志管理模块
负责日志生成、颜色区分和文件保存
"""

import os
import datetime
from pathlib import Path
from enum import Enum


class LogLevel(Enum):
    """日志级别枚举"""
    INFO = "INFO"
    WARNING = "WARNING"
    ERROR = "ERROR"


class Logger:
    """日志管理器类"""

    def __init__(self, log_dir):
        """
        初始化日志管理器
        
        Args:
            log_dir (str): 日志文件存储目录
        """
        self.log_dir = Path(log_dir)
        self.log_dir.mkdir(parents=True, exist_ok=True)
        
        # 创建今天的日志文件
        self.current_date = datetime.date.today()
        self.log_file = self._get_log_file_path(self.current_date)
        
        # 清理过期日志(保留30天)
        self._cleanup_old_logs()

    def _get_log_file_path(self, date):
        """
        获取指定日期的日志文件路径
        
        Args:
            date (datetime.date): 日期
            
        Returns:
            Path: 日志文件路径
        """
        return self.log_dir / f"{date.strftime('%Y%m%d')}_log.txt"

    def _cleanup_old_logs(self):
        """清理30天前的日志文件"""
        today = datetime.date.today()
        cutoff_date = today - datetime.timedelta(days=30)
        
        for log_file in self.log_dir.glob("*_log.txt"):
            try:
                # 从文件名提取日期
                date_str = log_file.name.split('_')[0]
                file_date = datetime.datetime.strptime(date_str, '%Y%m%d').date()
                
                # 删除过期日志
                if file_date < cutoff_date:
                    log_file.unlink()
            except (ValueError, OSError):
                # 文件名格式不正确或删除失败，跳过
                pass

    def _write_log(self, level, message):
        """
        写入日志到文件
        
        Args:
            level (LogLevel): 日志级别
            message (str): 日志消息
        """
        # 检查是否需要切换到新的日志文件
        today = datetime.date.today()
        if today != self.current_date:
            self.current_date = today
            self.log_file = self._get_log_file_path(today)
            self._cleanup_old_logs()
        
        # 格式化日志消息
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        log_entry = f"{timestamp} [{level.value}] {message}\n"
        
        # 写入日志文件
        try:
            with open(self.log_file, 'a', encoding='utf-8') as f:
                f.write(log_entry)
        except IOError as e:
            print(f"写入日志文件出错: {e}")

    def info(self, message):
        """
        记录INFO级别日志
        
        Args:
            message (str): 日志消息
        """
        self._write_log(LogLevel.INFO, message)

    def warning(self, message):
        """
        记录WARNING级别日志
        
        Args:
            message (str): 日志消息
        """
        self._write_log(LogLevel.WARNING, message)

    def error(self, message):
        """
        记录ERROR级别日志
        
        Args:
            message (str): 日志消息
        """
        self._write_log(LogLevel.ERROR, message)

    def get_recent_logs(self, lines=100):
        """
        获取最近的日志行
        
        Args:
            lines (int): 获取的行数
            
        Returns:
            list: 日志行列表
        """
        try:
            with open(self.log_file, 'r', encoding='utf-8') as f:
                all_lines = f.readlines()
                return all_lines[-lines:] if len(all_lines) > lines else all_lines
        except (IOError, FileNotFoundError):
            return []